//============================================================================
// Name        : TestC++.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <memory.h>
#include "TestFile.h"
#include "TestClass.h"
#include "World.h"
using namespace std;

//宏置换
#define print(value) cout<<(value)<<endl
#define join(a,b) a##b
#define  SQUARE(a) ((a)*(a))
#define  max(x,y) ((x)>(y) ? (x) : (y))

double power(int x,int n);

//void getAverg(int* array,int count);//相当于下面的
void getAverg(int array[],int count);

//模版方法
int larger(int a,int b);
template <class T> T smaller(T a,T b);

//引用传参
int changeToLarger(int& x,int& a,int& b);
int total = 5;//全局作用


int randomValue(int start ,int end);
//namespace mystd{
//	//外部链接 可以不使用include 和Using nameSpace
//  extern const int param;
//}
//extern const int param2;

int main() {
//	int count =5;
//	int total = ++count*3 + ++count*5;
//	cout<<"result:"<<total<<endl;
//	cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!


	//第一组总是相同的结果
//	cout<<"先测试默认的最大值 从0到"<<RAND_MAX<<endl;
//	cout<<rand()<<"  "<<rand()<<"  "<<rand()<<"  "<<endl;
//
//	srand((unsigned int)time(0));
//	cout<<"设置变元 从0到"<<RAND_MAX<<endl;
//	cout<<rand()<<"  "<<rand()<<"  "<<rand()<<"  "<<endl;

//	float v1 = 0.1f;
//	float v2 = 2.1f;
//	v1-=0.09f;
//	v2-=2.09f;
//	cout<<v1<<endl<<v2<<endl;

//	int value1 = 1;
//	long value2 = 12L;
//	float value3 = 2.1f;
//	double value4 = value1+value2+value3;
//	cout<<value4<<endl;

//	cout<<"short:"<<sizeof(short)<<endl;
//	cout<<"int:"<<sizeof(int)<<endl;
//	cout<<"long:"<<sizeof(long int)<<endl;
//	cout<<"float:"<<sizeof(float)<<endl;
//	cout<<"double:"<<sizeof(double)<<endl;
//	cout<<"long double:"<<sizeof(long double)<<endl;
//	cout<<"char:"<<sizeof(char)<<endl;

//	unsigned long red = 0xFF0000UL;
//	unsigned long white = 0xFFFFFFUL;
//	cout<<hex;//十六进制输出数据
//	cout<<setfill('0');//需要include iomanip
//	cout<<"\n       red   "<<setw(8)<<red;
//	cout<<"\n      ~red   "<<setw(8)<<~red;
//	cout<<"\n       white "<<setw(8)<<white;
//	cout<<"\n      ~white "<<setw(8)<<~white;
//	cout<<"\n   red|white "<<setw(8)<<(red|white);
//	cout<<"\n   red&white "<<setw(8)<<(red&white);
//	unsigned long mask = red^white;
//	cout<<"\n        mask "<<setw(8)<<mask;
//	cout<<"\n    mask^red "<<setw(8)<<(mask^red);
//	cout<<"\n  mask^white "<<setw(8)<<(mask^white);


//	string aa = "asdad";
//	string bb = "ccccc";
//	string ss[] = {aa,bb};
//	string cc=aa.substr(2,4);
//	cout<<aa.compare(bb)<<endl;
//	cout<<aa.find("dad")<<endl;
//	cout<<aa+bb<<endl;
//	cout<<ss[0]<<endl;
//	cout<<ss[0][3]<<endl;

//	string testString = "fuck this!";
//	string* pTestString = &testString;
//	cout<<pTestString<<endl;//输出 pTestString 指向的内存地址
//	cout<<*pTestString<<endl;//输出pTestString 指向的内存地址的值
//
//	//字符串字面量为const char,所以不允许修改
//	const char* charPoint = "abcdefg";
//	cout<<charPoint<<" : "<<*charPoint<<endl;

//	cout<<"为s分配内存空间:"<<endl;
//	string* s = new string("bbb");
//	cout<<"删除前的s地址:"<<s<<endl;
//	cout<<"s的值"<<*s<<endl;
//	delete s;
//	cout<<"删除后的s地址:"<<s<<endl;
//	cout<<"s的值:"<<*s<<endl;
//
//	string* ss =  new string[3];
//	ss[0]="ccc";//数组方式
//	ss[1]="ddd";
//	ss[2]="eee";
//	cout<<*ss<<endl;
//	cout<<*(ss+1)<<endl;//指针+数字方式
//	cout<<*(ss+2)<<endl;
//
//	delete [] ss;
//
//
//	int value = 2;
//	int powResult = power(value,3);
//	cout<<"2的三次方是:"<<powResult<<endl;

	//数组指针传参
//	int count = 10;
//	int* a=new int[count];//用new 一定要用指针来接收
//	memset(a,0,count*sizeof(int));
//	for(int i=0;i<count;i++){
//		a[i]=count;
//	}
//	getAverg(a,count);

//	cout<<a[2]<<endl;
//	int *p = a;
//	cout<<a<<endl;
//	cout<<p<<endl;
//	cout<<a[1]<<endl;
//	cout<<p[1]<<endl;
//	cout<<sizeof(a)<<endl;
//	cout<<sizeof(p)<<endl;

	//引用传参
//	int i = 10;
//	int a = 20;
//	int b = 30;
//	cout<<"转换前 i的值:"<<i<<endl;
//	cout<<"[引用参数]把i转换为 20 和 30 中最大的值:"<<changeToLarger(i,a,b)<<endl;
//	cout<<"转换后 i的值:"<<i<<endl;

	//模版参数
//	int a = 5;
//	int b = 10;
//	long c = 1000;
//	cout<<"[正常方法]5 和 10 较大的是:"<<larger(a,b)<<endl;
//	cout<<"[模版方法]5 和 10 较小的是:"<<smaller(a,b)<<endl;
//	cout<<"[显式模版方法]5 和 10 较小的是:"<<smaller<long>(a,c)<<endl;

	//函数指针  指定返回类型,和参数
//	int (*md)(int a, int b);
//	md = larger;
//	cout<<"[函数指针]5 和 10 较大的是:"<<md(5,10)<<endl;

	//作用域
//	int i = 50;
//	{
//		int i=60;
//		cout<<"i 的值:"<<i<<endl;
//	}
//	cout<<"外层i 的值:"<<i<<endl;
//
//	int total = 6;
//	cout<<"局域变量 total:"<<total<<endl;
//
//	cout<<"全局变量 total:"<<::total<<endl;


	//命名空间
//	cout<<mystd::param<<endl;
//	cout<<param2<<endl;

	//使用命名空间 myst下的printResult方法输出123
//	mystd::printResult(123);

	//使用宏置换
	print(6);

	//拼出一个变量名
//	int a1 = 6;
//	cout<<join(a,1)<<endl;

	//结构
//	mystd::Person p = {
//			{"xian","jie can "}
//	};
//	p.showInfo();
//	//使用对象指针
//	mystd::Person* p2 = &p;
//	p2->showInfo();


	//对象大小
//	mystd::class_person cp;
//	cout<<"自己计算的大小:"<<cp.totalSize()<<endl;
//	cout<<"size of 计算的大小"<<sizeof (mystd::class_person)<<endl;

	//类构造与析构
//	TestClass* ts = new TestClass();
//	delete ts;
	//自动释放
//	TestClass ts2;


	//继承  虚构
//	TestClass tc1 ;
//	cout<<"TestClass 对象调用showVolume方法  会调用TestClass的volume方法"<<endl;
//	tc1.showVolume();
//	TestClass2 tc2;
//	cout<<"TestClass2 对象调用showVolume方法  会调用TestClass2的volume方法,因为volume是虚函数"<<endl;
//	tc2.showVolume();
////	tc2.volume();
//	TestClass *tc2_1 = &tc2;
//	cout<<"强制调用TestClass 的volume方法"<<endl;
//	tc2_1->TestClass::volume();

//	int a = 5;
//	cout<<SQUARE(a++)<<endl;
//	int b = 5;
//	int c = (b++)*(b++)-(b++);
//	cout<<c<<endl;
//	cout<<b<<endl;
//	int a = 100;
//	int result= max(a++,99);
//	cout<<result<<endl;
//	cout<<a<<endl;
//
//
//
	char* sss = "a";
	char ss = 'a';
	cout<<(int)sss[2]<<endl;

//	int array2[2] = {1,2};
//	int* array =array2;
//	cout<<sizeof(array)<<endl;



	//randomValue(1,2);

	World* w = World::getInstance();
	cout<<w->name<<endl;

}



double power(int x,int n){
	int result = 1;
	for(int i=0;i<n;i++){
		result = result * x;
	}
	return result;
}

void getAverg(int array[],int count){
	int total = 0;
	for(int i=0;i<count;i++){
		total = total+array[i];
	}
	cout<<"averg:"<<total/count<<endl;
}

int larger(int a,int b){
	return a>b?a:b;
}

template <class T> T smaller(T a,T b){
	return a<b?a:b;
}

int changeToLarger(int& x,int& a,int& b){
	x=a>b?a:b;
	return x;
}

void  mystd::Person::showInfo(){
	name.show();
 }

void mystd::Name::show(){
	cout<<firstName<<endl;
	cout<<lastName<<endl;
}

int mystd::class_person::totalSize(){
	return name.totalSize();
}

int mystd::class_name::totalSize(){
	return ((sizeof firstName)+(sizeof lastName));
}

int randomValue(int start ,int end){
	int ran_num = 0;

	//每次都一样
	for(int i=0;i<10;i++){
		ran_num=rand() % 6;
		cout<<ran_num<<" ";
	}

	//和上面的一样
	cout<<""<<endl;
	srand(1);
	for(int i=0;i<10;i++){
		ran_num=rand() % 6;
		cout<<ran_num<<" ";
	}

	//指定种子6,和上面不一样
	cout<<""<<endl;
	srand(6);
	for(int i=0;i<10;i++){
		ran_num=rand() % 6;
		cout<<ran_num<<" ";
	}


	//指定种子为系统流逝时间

	//time_t被定义为长整型，它返回从1970年1月1日零时零分零秒到目前为止所经过的时间，单位为秒

	/**
	 * 将rand()的返回值与6求模是必须的，这样才能确保目的随机数落在[0,6)之间，否则rand()的返回值本身可能是很巨大的。
		一个通用的公式是：
		要取得[a,b)之间的随机整数，使用（rand() % (b-a)）+ a （结果值将含a不含b）。
		在a为0的情况下，简写为rand() % b。
	 */
	cout<<""<<endl;
	srand((unsigned)time(0));
	for(int i=0;i<10;i++){
		ran_num=rand() % 6;
		cout<<ran_num<<" ";
	}


	//如果想取更大范围的随机浮点数，比如1～10，可以将
	//rand() /(double)(RAND_MAX) 改为 rand() /(double)(RAND_MAX/10)
	double ran_numf=0.0;
	srand((unsigned)time(0));
		for(int i=0;i<10;i++){
		ran_numf = rand() / (double)(RAND_MAX);
		cout<<ran_numf<<" ";
	}


	return ran_num;
}



